/*
 * Copyright 2013 University of Padua, Italy
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package it.dei.unipd.healthservice.servlet;

import it.dei.unipd.healthservice.database.CreateFabbricaDatabase;
import it.dei.unipd.healthservice.resource.Fabbrica;


import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 
 * @author Simone Zennaro
 * @version 1.00
 */
public class FabbricaServlet extends AbstractDatabaseServlet {

	public static enum Error{NO_ERROR,NO_CONNECTION_DB,ERROR_ACCESS_DB,SERVLET_ERROR,IO_EXCEPTION}
	
	/**
	 * Gestisce login e logout di una fabbrica
	 * 
	 * @param req
	 *            la richiesta ricevuta dal client.
	 * @param res
	 *            la rispota fornita dal server.
	 * 
	 * @throws ServletException
	 *             se ci sono problemi nell'esecuzione della servlet.
	 * @throws IOException
	 *             se ci sono problemi nella comunicazione client-server.
	 */
	public void doGet(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {
		doPost(req, res);
	}
	
	/**
	 * Gestisce login e logout di una fabbrica
	 * 
	 * @param req
	 *            la richiesta ricevuta dal client.
	 * @param res
	 *            la rispota fornita dal server.
	 * 
	 * @throws ServletException
	 *             se ci sono problemi nell'esecuzione della servlet.
	 * @throws IOException
	 *             se ci sono problemi nella comunicazione client-server.
	 */
	public void doPost(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {

		// imposta il tipo MIME della risposta
		res.setContentType("text/html");

		// ottiene un flusso di uscita per scrivere la risposta
		PrintWriter out = res.getWriter();
		Error e=Error.NO_ERROR;
		//
		if(req.getParameter("action").equals("login")){
			e=login(req, res);	
		}
		else if(req.getParameter("action").equals("logout")){
			e=logout(req, res);
		}
	
		//gestione di eventuali errori
		if(e!=Error.NO_ERROR){
			switch (e) {
			case NO_CONNECTION_DB:
				out.println("Nessuna connessione con il db");
				break;
			case ERROR_ACCESS_DB:
				out.println("Errore nell'accedere al db");
				break;
			case SERVLET_ERROR:
				out.println("Errore nel redirect della pagina");
				break;
			case IO_EXCEPTION:
				out.println("Errore nel IO per il redirect della pagina");
				break;
			default:
				break;
			}
		}
	}
	
	/**
	 * Esegue il login di una fabbrica e crea la sessione
	 * @param req
	 *            la richiesta ricevuta dal client.
	 * @param res
	 *            la rispota fornita dal server.
	 * 
	 * @throws ServletException
	 *             se ci sono problemi nell'esecuzione della servlet.
	 * @throws IOException
	 *             se ci sono problemi nella comunicazione client-server.
	 */
	private Error login(HttpServletRequest req,HttpServletResponse res){
		String login = req.getParameter("login");
		String password = req.getParameter("password");
		
		Fabbrica fab = new Fabbrica(login,password);
		
		Connection con = null;
		
		try {
			con = DS.getConnection();
			//se esiste un cliente con queste credenziali
			if(new CreateFabbricaDatabase(con, fab).existsFabbrica()){ 
				HttpSession session=req.getSession(); //creo una sezione
				session.setAttribute("login", login);
				if (login.equals("sedecentrale"))
					res.sendRedirect("index_sede_centrale");
				else
					res.sendRedirect("index_fabbrica.jsp");//visualizzo l'homepage
			}
			else{
				res.sendRedirect("login_fabbrica.jsp");
			}
		} catch (NullPointerException ex) {
			return Error.NO_CONNECTION_DB;
		} catch (SQLException ex) {
			return Error.ERROR_ACCESS_DB;
		
		} catch (IOException e) {
			return Error.IO_EXCEPTION;
		}

		return Error.NO_ERROR;
	}
	
	/**
	 * Esegue il logout della fabbrica dal Sito
	 * 
	 * @param req
	 *            la richiesta ricevuta dal client.
	 * @param res
	 *            la rispota fornita dal server.
	 * 
	 * @throws ServletException
	 *             se ci sono problemi nell'esecuzione della servlet.
	 * @throws IOException
	 *             se ci sono problemi nella comunicazione client-server.
	 */
	private Error logout(HttpServletRequest req,HttpServletResponse res){
		
				HttpSession session=req.getSession(); //creo una sezione
				session.setAttribute("login", null);
				RequestDispatcher dispatcher = req.getRequestDispatcher("index_fabbrica.jsp");
				try {
					dispatcher.forward(req, res);
				} catch (ServletException e) {
					return Error.SERVLET_ERROR;
				} catch (IOException e) {
					return Error.IO_EXCEPTION;
				} 
		return Error.NO_ERROR;
	}
	
}
